package com.itzmn.datastructure.newcode;

/**
 * @Author: 张梦楠
 * @Date: 2019/1/1 13:23
 * 简书：https://www.jianshu.com/u/d611be10d1a6
 * 码云：https://gitee.com/zhangqiye
 * @Description: 循环打印矩阵
 *
 *  一个矩阵，顺时针打印，牛客网剑指offer题，进行重构。第二种思路
 *得到左上角和右下角的坐标，形成一个圈，然后打印这个圈，然后进入内部的圈。这样就是两个函数
 * 一个是打印圈的函数，一个是循环几个圈
 *  1  2  3  4
 *  5  6  7  8
 *  9  10 11 12
 *  13 14 15 16
 *
 *  上面打印到3，右边打印到12，下面打印到14，左边打印到5
 *  然后新的循环
 */
public class CyclicPrintMatrix {

    public static void main(String[] args) {
        new CyclicPrintMatrix().init();
    }

    private void init() {

        int[][] ints = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        printMatrix(ints);
    }

    public void printMatrix(int[][] arr){

        int row = arr.length;
        int col = arr[0].length;

        int ltr = 0,ltc=0,rbr = row-1,rbc = col-1;

        while (ltr<=rbr && ltc<=rbc){
            print(arr,ltr++,ltc++,rbr--,rbc--);
        }

    }

    public void print(int[][] arr,int LTr,int LTc,int RBr,int RBc){

        // 如果这个数据是同一行，说明就是只有一行
        if (LTr == RBr){
            for (int i=LTc;i<=RBc;i++){
                System.out.print(arr[LTr][i] + " ");
            }
            // 如果是同一列，说明就只有一列
        }else if(LTc == RBc){
            for (int i=LTr; i<=RBr; i++){
                System.out.print(arr[i][LTc] + " ");
            }
        }else {
            int currentRow = LTr;
            int currentCol = LTc;
            // 说明可以组成一个圈
            // 打印上面一行
            while (currentCol < RBc){
                System.out.print(arr[LTr][currentCol++] + " ");
            }

            // 打印右边一列
            while (currentRow < RBr){
                System.out.print(arr[currentRow++][RBc] + " ");
            }
            // 打印下面一行,行不变，切换列
            while (RBc > LTc){
                System.out.print(arr[RBr][RBc--] + " ");
            }
            // 打印左边一列，列不变，行切换
            while (RBr > LTr){
                System.out.print(arr[RBr--][LTc] + " ");
            }
        }
    }



}
